package com.spsa.negocio.utilidades;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.faces.context.FacesContext;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.spsa.Parametros;
import com.spsa.excepciones.EstadoIlegalExcepcion;
import com.spsa.excepciones.RecuperarDatosException;
import com.spsa.negocio.ProcesadorMensajesBean;
import com.spsa.persistencia.dao.DestinatarioDao;
import com.spsa.persistencia.dao.InterfazDao;
import com.spsa.persistencia.dao.ReporteDao;
import com.spsa.persistencia.dao.TiendaDao;
import com.spsa.persistencia.dao.UsuarioDao;
import com.spsa.persistencia.entidades.Destinatario;
import com.spsa.persistencia.entidades.Interfaz;
import com.spsa.persistencia.entidades.Tienda;
import com.spsa.persistencia.entidades.Usuario;

@Singleton
@Lock(LockType.READ)
@Startup
public class SingletonDatos implements Serializable {

	static final Logger logger = LogManager.getLogger(SingletonDatos.class.getName());

	private List<Tienda> tiendas;
	private List<Interfaz> interfaces;
	private List<Usuario> usuarios;
	@EJB
	private TiendaDao tiendaDao;
	@EJB
	private DestinatarioDao destinatarioDao;
	@EJB
	private ReporteDao rutaReporteDao;
	@EJB
	private InterfazDao interfazDao;
	@EJB
	private UsuarioDao usuarioDao;
	@EJB
	private ProcesadorMensajesBean procesadorMensajes;
	private List<Destinatario> destinatarios;
	private String rutaReporte = Parametros.get("SingletonDatos.ARCHIVO_REPORTE"); //$NON-NLS-1$

	@PostConstruct
	public void inicializar() {
		cargarDatosUsuarios();
		cargarDatosTiendas();
		cargarDatosDestinatarios();
		cargarDatosInterfaces();
		procesadorMensajes.procesarMensajes();
	}

	public void cargarDatosUsuarios() {
		try {
			usuarios = usuarioDao.listar();
		} catch (RecuperarDatosException e) {
			mostrarPaginaError();
		}
	}

	public void cargarDatosTiendas() {
		try {
			tiendas = tiendaDao.listar();
		} catch (RecuperarDatosException e) {
			mostrarPaginaError();
		}
	}

	private void cargarDatosInterfaces() {
		try {
			interfaces = interfazDao.listar();
		} catch (RecuperarDatosException e) {
			mostrarPaginaError();
		}
	}

	public void cargarDatosDestinatarios() {
		try {
			destinatarios = destinatarioDao.listar();
		} catch (RecuperarDatosException e) {
			mostrarPaginaError();
		}
	}

	public Interfaz buscarInterfaz(String descripcion) throws EstadoIlegalExcepcion {
		for (int i = 0; i < interfaces.size(); i++) {
			if (interfaces.get(i).getDescripcion().equals(descripcion))
				return interfaces.get(i);
		}

		throw new EstadoIlegalExcepcion("No se encontro los datos de la interfaz: " + descripcion); //$NON-NLS-1$
	}

	public boolean tiendaEstaActiva(String codigoTienda) {
		Tienda tienda = buscarTienda(codigoTienda);
		return tienda.isActivo();
	}

	public boolean existeInterfaz(String descripcion) {
		try {
			return buscarInterfaz(descripcion) != null;
		} catch (EstadoIlegalExcepcion e) {
			return false;
		}
	}

	public Tienda buscarTienda(String codigoTienda) throws EstadoIlegalExcepcion {
		for (int i = 0; i < tiendas.size(); i++) {
			if (tiendas.get(i).getCodigo().equals(codigoTienda))
				return tiendas.get(i);
		}

		throw new EstadoIlegalExcepcion("No se encontro los datos de la tienda con codigo: " + codigoTienda); //$NON-NLS-1$
	}

	public boolean existeTienda(String codigoTienda) {
		try {
			return buscarTienda(codigoTienda) != null;
		} catch (EstadoIlegalExcepcion e) {
			return false;
		}
	}

	private void mostrarPaginaError() {
		try {
			FacesContext.getCurrentInstance().getExternalContext().redirect("error.html");} //$NON-NLS-1$
		catch (IOException e2) {
		}
	}

	public List<Interfaz> getInterfaces() {

		List<Interfaz> interfaces2 = new ArrayList<Interfaz>();
		for (int i = 0; i < interfaces.size(); i++) {
			if (interfaces.get(i).getDescripcion().equals("Maestro Final de precio"))
				interfaces2.add(interfaces.get(i));
		}
		return interfaces2;
	}

	public List<Tienda> getTiendas() {
		return tiendas;
	}

	public List<Usuario> getUsuarios() {
		return usuarios;
	}

	public List<Destinatario> getDestinatarios() {
		return destinatarios;
	}

	public String getRutaReporte() {
		return rutaReporte;
	}
}
